1 例示用データの用意

今回もこのデータを使う

library("readxl")
df <- read_excel("classes.xlsx") # エクセル読み込み
head(df)
## # A tibble: 6 x 5
##   クラス 名前   英語  現文  数学
##   <chr>  <chr> <dbl> <dbl> <dbl>
## 1 B      逢坂     77    67    61
## 2 A      荻窪     90    86    89
## 3 A      茅原     79    81    75
## 4 B      金元     76    75    61
## 5 C      原田     67    66    57
## 6 A      佐倉     72    84    79

2 描画用パッケージ

グラフの描画で役立つパッケージを紹介する

2.1 ggplot2

{ggplot2}というグラフの描画用パッケージは綺麗なグラフを描くことができる。

ggplotは次のように2つ以上の手順をとり,2つ以上の関数を+でつなげていき,レイヤーを重ねるように描画していく。

  1. キャンバスを用意する(ggplot(データフレーム, aes(x, y))
  2. グラフを用意する(geom_histogram()などgeom_なんたらという関数)
  3. グラフの装飾のための関数を使う場合は,さらにレイヤーを重ねていく
# パッケージ読み込み
library(tidyverse) # ggplot2もtidyverseパッケージに含まれている

# 棒グラフをつくり,gに代入する
g <- ggplot(df, aes(x = クラス)) + # dfのデータでキャンバスを作る
  geom_bar() # キャンバスに棒グラフgeom_bar()を重ねる
g # 表示

2.2 plotly

{plotly}パッケージは動的なグラフ(マウスを乗せると情報が表示されたりするグラフ)を描くことができる。

ggplotly()関数を使うと,{ggplot2}で描いたグラフを動的なものに変換できる。

install.packages("plotly")
library(plotly)
ggplotly(g)   # ggplot2のグラフをplotlyのグラフへ変換

3 データの分布を要約する

3.1 平均・分散など

データの分布を要約するための指標(要約統計量)の代表的なものが平均(mean)と分散(variance)である。

  • 平均(mean):\(n\)個のデータ\(x_i\)の総和を,サンプルサイズ\(n\)で割ったもの。

\[ \bar{x} = \frac{1}{n}\sum_{i=1}^n x_i \]

  • 分散(variance):平均からの差の2乗和の平均

\[ \sigma^2=\frac{1}{n}\sum_{i=1}^{n}(x_i-\bar{x})^2 \]

ただし,Rのvar()関数は抽出された標本で計算する分散であることに対する修正を加えている不偏分散というものである。

\[ s^2=\frac{1}{n-1}\sum_{i=1}^{n}(x_i-\bar{x})^2 \]

# 不偏分散
var(df$英語)
## [1] 85.4609

分散は2乗しているので,それを元の単位に戻すために平方根をとったものが標準偏差(standard deviation)である。

# 不偏標準偏差
sd(df$英語)
## [1] 9.244506

3.2 要約統計量

summary()関数は,データフレームの各行に関する代表値などの情報を取得することができる関数である。

summary(df)
##     クラス              名前                英語            現文      
##  Length:40          Length:40          Min.   :45.00   Min.   :57.00  
##  Class :character   Class :character   1st Qu.:64.75   1st Qu.:67.00  
##  Mode  :character   Mode  :character   Median :68.00   Median :71.50  
##                                        Mean   :68.97   Mean   :72.72  
##                                        3rd Qu.:76.00   3rd Qu.:79.25  
##                                        Max.   :90.00   Max.   :86.00  
##       数学      
##  Min.   :52.00  
##  1st Qu.:62.50  
##  Median :71.00  
##  Mean   :70.17  
##  3rd Qu.:77.50  
##  Max.   :89.00

「クラス」と「名前」は文字列(character)型なので,Length(行数,標本数)が40であることくらいしか表示されない。

「英語」「現文」「数学」は整数(integer)型なので,代表値などの要約統計量(summary statistics)が表示されている。

それぞれの統計量の意味は

  • Min.が最小値
  • 1st Qu.第一四分位数(1st quantile):「データを小さいものから順に並べた時に標本数の4分の1の位置(下位25%)にくる値」
  • Median中央値(median):「データを小さい順に並べた時に標本数の2分の1の位置にくる値」
  • Mean平均値(mean):「データの総計をデータの個数で割ったもの」\(\sum_{i=1}^n x_i/n\)
  • 3rd Qu.第三四分位数(3rd quantile):「データを小さい順に並べた時に標本数の4分の3の位置(75%)にくる値」
  • Max.が最大値

である。これらのうちMean以外の5つの統計量をまとめて五数要約という。

平均値は外れ値(極端に高かったり低かったりする値)の影響を受けやすいため,これらの統計量を見ることで,中央値と平均値が大きく異なるデータは外れ値があったりデータの分布に歪みがあることが推測できるわけである。

4 2変数の関係を要約する

4.1 相関係数

相関係数(correlation coefficient)は2つの量的変数の直線的な関係の強さを測るもので,次の式で定義される

\[ \begin{align} x\text{と}y\text{の相関係数}r &= \frac{x\text{と}y\text{の共分散}}{x\text{の標準偏差}\times y\text{の標準偏差}} \\ &= \frac{\frac{1}{n} \sum_{i=1}^n (x_i - \bar{x})(y_i - \bar{y})} {\sqrt{\frac{1}{n} \sum_{i=1}^n (x_i - \bar{x})^2} \sqrt{\frac{1}{n} \sum_{i=1}^n (y_i - \bar{y})^2}} \end{align} \]

Rではcor()で計算できる。相関係数は-1から+1の範囲の値をとり,絶対値で1に近いほど関係が強いことを示す。

cor(x = df$英語, y = df$数学)
## [1] 0.5304525

4.2 相関行列

相関係数が入った行列を相関行列という

cor(df[,3:5])
##           英語      現文      数学
## 英語 1.0000000 0.4926505 0.5304525
## 現文 0.4926505 1.0000000 0.7328408
## 数学 0.5304525 0.7328408 1.0000000

5 1変数のグラフ

5.1 ヒストグラム

ヒストグラムは量的変数の分布を確認するには極めて有用なグラフである。

# ヒストグラム
ggplot(df, aes(x = 英語)) +
  geom_histogram(bins = 10) # binsは棒の数。指定しない場合はbins=30になる

R本体の機能でヒストグラムを描く場合はhist()を使う

# ヒストグラム
hist(x = df[["数学"]])

5.2 棒グラフ

# ggplotの棒グラフ
ggplot(df, aes(x = クラス))+
  geom_bar()

6 2変数のグラフ

6.1 散布図

2変数でグラフを描く場合,キャンバスにx(グラフ横軸)とy(グラフ縦軸)の両方を指定する。

そして散布図を描く場合はgeom_point()+でつなげればよい

ggplot(df, aes(x = 英語, y = 現文))+
  geom_point()

6.2 折れ線グラフ

折れ線グラフはgeom_line()で描くことができる。

Excelで言うところの「マーカー付き折れ線グラフ」にしたい場合はgeom_point()を重ねればよい。

ggplot(df, aes(x = 英語, y = 現文))+
  geom_line()+ # 折れ線
  geom_point() # マーカー

(参考)アメリカのGNP

上では説明の簡単のため散布図と同じデータを使ったが,折れ線グラフは本来は時系列データに使うのが望ましい。

そこで,以下ではRにあらかじめ収録されている練習用のデータセットのひとつであるlongleyを使った例をのせる。

このデータは1947~62年のアメリカのGNPや雇用者数などが収録されている(詳細はhelpを参照してほしい)。

head(longley)
##      GNP.deflator     GNP Unemployed Armed.Forces Population Year Employed
## 1947         83.0 234.289      235.6        159.0    107.608 1947   60.323
## 1948         88.5 259.426      232.5        145.6    108.632 1948   61.122
## 1949         88.2 258.054      368.2        161.6    109.773 1949   60.171
## 1950         89.5 284.599      335.1        165.0    110.929 1950   61.187
## 1951         96.2 328.975      209.9        309.9    112.075 1951   63.221
## 1952         98.1 346.999      193.2        359.4    113.270 1952   63.639
ggplot(longley, aes(x = Year, y = GNP))+
  geom_line()+ # 折れ線
  geom_point()+ # マーカー
  labs(title = "1947~62年のアメリカのGNP")

6.3 箱ひげ図

箱ひげ図は五数要約の統計量(最小値,第一四分位数,中央値,第三四分位数,最大値)をプロットすることで分布の概形を表示する図である。

g <- ggplot(df, aes(x = クラス, y = 現文))+
  geom_boxplot()+
  labs(title = "クラスごとの現文の点数の分布")
ggplotly(g)

7 層別化

ggplot()関数の中に入れるaes()関数のfillcolorといった引数に質的変数を指定することで,色の塗り分けによる層別化ができる。

これにより3つ目の変数の情報を表現できる。

ggplot(df, aes(x = 英語, y = 現文, fill = クラス, color = クラス))+
  geom_point()+
  labs(title = "英語と現文の得点の散布図をクラスごとに塗り分けたもの")